import datetime
import logging
from django.conf import settings
from django.db.models import Q
from django.views.generic.base import View
from utils.mixin_utils import LoginRequiredMixin
from apscheduler.schedulers.background import BackgroundScheduler
from django_apscheduler.jobstores import DjangoJobStore, register_job

# 实例化日志类
logger = logging.getLogger(__name__)
# 定义非阻塞后台进程类的定时任务
scheduler = BackgroundScheduler(timezone='Asia/Shanghai')  # 时区必须和django settings里保持一致，才能按时执行（数据库里的时间显示有误不影响）
scheduler.add_jobstore(DjangoJobStore(), 'default')


# 使用装饰器注册定时任务（若新建数据库初始化表时，需要先注释掉该装饰器）
# @register_job(scheduler, 'cron', hour=12, minute=0, replace_existing=True)
def job_clean_overdue_task():
    """
    清理过期任务：过了要求完成时间后置任务状态为”已过期“
    """
    # clean_rows = TaskAssignment.objects.filter(is_delete=0, eEndTime__lt=datetime.datetime.now(),
    #                                            taskState__in=['未开始', '进行中']).update(taskState='已过期')
    # logger.info(f"清理过期任务数：{clean_rows}")


# 方法一：本地启动定时任务
# scheduler.start()


# def init_scheduler(scheduler):
#     """
#     Linux下，使用文件锁启动scheduler，避免使用gunicorn启动多个worker后重复执行定时任务
#     """
#
#     import fcntl
#     import atexit
#     f = open("scheduler.lock", "wb")
#     try:
#         fcntl.flock(f, fcntl.LOCK_EX | fcntl.LOCK_NB)
#         scheduler.start()
#     except:
#         pass
#
#     def unlock():
#         fcntl.flock(f, fcntl.LOCK_UN)
#         f.close()
#
#     atexit.register(unlock)


# 方法三：Linux下使用gunicorn启动服务时，利用文件锁避免重复启动定时任务
# init_scheduler(scheduler)


# Create your views here.
class ListView(LoginRequiredMixin, View):
    pass
